/*
 * fileio.c
 *
 *  Created on: Dec 16, 2011
 *      Author: sanglei
 * description: 负责对文件的对写，以及格式化操作等
 */

#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "../headers/fileio.h"

FILE * readFile(const char *path,const char *mode){
	assert(path!=NULL);
	assert(mode!=NULL);
	return fopen(path,mode);
}

//C语言中如何读取文件的一行后，将相应的值取出！
int split(FILE *fp,const char*interval){
	if(strcmp(interval," ") == 0){//该字符串以空格分隔,可以用scanf处理，但保留"\n"在缓冲区里
		//如果类似于  "1 2\n",且分隔后取整数
		int i,j;
		fscanf(fp,"%d%d",&i,&j);//默认以空格分隔开，且忽略"\n";i=1,j=2

		char a[10],b[10];
		fscanf(fp,"%s%s",a,b);// a="1",b="2",或者 i=atoi(a);转为整型

		//可以fscanf()后，加上一句话
		fgetc(fp);//将"\n"从缓冲区中读取并抛弃

		//-----------------另一种方式--------------------------------

		//又或者，如果希望读取一整行(包括"\n"),则可以先读取，然后格式话
		char line[256];
		fgets(line,sizeof(line)-1,fp);
		sscanf(line,"%s%s",a,b);//注意：不是fscanf，而是sscanf！



	}else{
		//例如 "1->2\n",则上面的方法失效
		char line[256];
		fgets(line,sizeof(line)-1,fp);//读取一行

		char *strLine = line;//操作字符数组，因line为指针常量，无法操作
		char *buf = strstr(strLine,interval);
		while(buf!=NULL){
			*buf = '\0';
			printf("%s ",strLine);//分隔符前的一个token
			strLine = buf + strlen(interval);//抛弃前一个token,注意此处不能用sizeof，而只能用strlen!
			buf = strstr(strLine,interval);
		}

		if(buf == NULL && strcmp(strLine,"\n") >0 ){//最后一个元素，若源字符串为"1->2->",则strLine == line
			char * rear = strLine +(strlen(strLine)-1);
			*rear = '\0';//删除掉换行符 "\n"
			printf("%s ",strLine);
		}
	}
	return 0;
}

void main_file_io(){
	FILE* fp = readFile("data/graph.txt","r");
//	split(fp," ");
	split(fp,"-");
	fclose(fp);
}
